package client.jobs;

import client.MapleCharacter;
import client.skills.Skill;
import handling.channel.handler.AttackInfo;
import server.MapleStatEffect;
import server.life.MapleMonster;
import tools.AttackPair;
import tools.data.input.LittleEndianAccessor;

/**
 * @Author dwang
 * @Description 需要子类实现的接口，和抽象类的功能区分开，这里专门编写需要实现的接口
 * @create 2022/5/18 17:00
 * @Modified By:
 */
public interface IJobFunction {

    // parse
    void parseCloseJobSkip1(AttackInfo ai, LittleEndianAccessor lea, boolean energy);

    void parseCloseAICharge(MapleCharacter chr, AttackInfo ai, LittleEndianAccessor lea, boolean energy, Skill skill);

    void parseCloseJobSkip2(MapleCharacter chr, AttackInfo ai, LittleEndianAccessor lea);

    void parseCloseJobSkip3(MapleCharacter chr, AttackInfo ai, LittleEndianAccessor lea, boolean energy, Skill skill);


    // apply attack
    int applySkillMobCount(MapleCharacter player, AttackInfo attack, MapleStatEffect effect);

    int getSkillAttackCount(MapleStatEffect effect, MapleCharacter player, AttackInfo attack);


    long beforeAttack(MapleCharacter player, AttackInfo attack, MapleMonster monster, int visProjectile);

    void onAttack(final MapleCharacter player, final MapleMonster monster, int skillid, long totDamage, AttackPair oned);

    void afterAttackHandler(MapleCharacter player, int mobCount, int skillid, boolean isCritDamage);
}
